package cci;

import cdp.*;
import cgd.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet(name = "SiteCtrl", urlPatterns = {"/Site"})
public class SiteCtrl extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        RequestDispatcher cih;
        String pagina = "";
        String evento = request.getParameter("evento");
        if (evento == null) {
            try {
                List<Marca> listaMarcas = MarcaDao.getInstance().obterTodos();
                request.setAttribute("listaMarcas", listaMarcas);
                List<Produto> listaProdutos = ProdutoDao.getInstance().obterTodos();
                request.setAttribute("listaProdutos", listaProdutos);
            } catch (Exception e) {
                e.printStackTrace();
            }
            cih = request.getRequestDispatcher("site.jsp");
            cih.forward(request, response);
            return;
        }
        try {
            if (evento.equals("pesquisar")) {
                Marca marca = MarcaDao.getInstance().consultar(Integer.parseInt(request.getParameter("marca")));
                List<Produto> listaProdutos = MarcaDao.getInstance().obterProdutos(marca);
                request.setAttribute("listaProdutos", listaProdutos);
                //##################### CONCERTAR
                pagina = "index";
            } else if (evento.equals("login")) {
                response.sendRedirect("loginCliente.jsp");
                return;
            } else if (evento.equals("logout")) {
                HttpSession session = request.getSession();
                session.invalidate();
                pagina = "index";
            } else if (evento.equals("visualizar_carrinho")) {
                pagina = "exibirCarrinho";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        cih = request.getRequestDispatcher(
                pagina + ".jsp");
        cih.forward(request, response);
        return;
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        RequestDispatcher cih;
        String mensagem = "";
        String evento = request.getParameter("evento");
        try {
            if (evento.equals("logarCliente")) {
                Cliente cliente = (Cliente) ClienteDao.getInstance().verificarLogin(request.getParameter("nome"), request.getParameter("senha"));
                if (cliente == null) {
                    mensagem = "Cliente não cadastrado";
                    response.sendRedirect("loginCliente.jsp?mensagem=" + mensagem);
                    return;
                }
                HttpSession session = request.getSession();
                session.setAttribute("usuario", "true");
                session.setAttribute("cliente", cliente);
            } else if (evento.equals("logarAdmin")) {
                if (request.getParameter("nome").equals("admin") && request.getParameter("senha").equals("admin")) {
                    HttpSession session = request.getSession();
                    session.setAttribute("admin", "true");
                    cih = request.getRequestDispatcher("admin.jsp");
                    cih.forward(request, response);
                    return;
                } else {
                    mensagem = "Usuário não cadastrado";
                    response.sendRedirect("loginAdmin.jsp?mensagem=" + mensagem);
                    return;
                }
            } else if (evento.equals("addCarrinho")) {
                HttpSession session = request.getSession();
                List<Produto> listaProdutos = (List<Produto>) session.getAttribute("listaProdutos");
                if (listaProdutos == null) {
                    listaProdutos = new ArrayList<Produto>();
                }
                Produto produto = ProdutoDao.getInstance().consultar(Integer.parseInt(request.getParameter("id_produto")));
                listaProdutos.add(produto);
                session.setAttribute("listaProdutos", listaProdutos);
            } else if (evento.equals("removerCarrinho")) {
                HttpSession session = request.getSession();
                List<Produto> listaProdutos = (List<Produto>) session.getAttribute("listaProdutos");
                Produto produto = ProdutoDao.getInstance().consultar(Integer.parseInt(request.getParameter("id_produto")));
                listaProdutos.remove(produto);
                session.setAttribute("listaProdutos", listaProdutos);
            } else if (evento.equals("finalizar_compra")) {
                HttpSession session = request.getSession();
                List<Produto> listaProdutos = (List<Produto>) session.getAttribute("listaProdutos");
                Compra compra;
                Cliente cliente;
                double vip;
                Relatorio relatorio;
                for (Produto produto : listaProdutos) {
                    compra = new Compra();
                    compra.setProduto(produto);
                    compra.setQuantidade(Integer.parseInt(request.getParameter("qnt-" + produto.getId())));
                    cliente = (Cliente) session.getAttribute("cliente");
                    vip = (cliente.getTipoCliente().equals(TipoCliente.VIP)) ? 0.9 : 1;
                    compra.setValorTotal(produto.getPreco() * compra.getQuantidade() * vip);
                    compra.setCliente(cliente);
                    compra.setDataCompra(new Date());
                    CompraDao.getInstance().salvar(compra);
                    cliente.setTotalCompra(cliente.getTotalCompra()+compra.getValorTotal());
                    ClienteDao.getInstance().salvar(cliente);
                    if (compra.getQuantidade() > produto.getQuantidade()) {
                        relatorio = RelatorioDao.getInstance().consultarPorProduto(produto);
                        if (relatorio == null) {
                            relatorio = new Relatorio();
                            relatorio.setProduto(produto);
                            relatorio.setQuantidade(compra.getQuantidade()-produto.getQuantidade());
                            relatorio.setDataCompra(new Date());
                        } else {
                            relatorio.setQuantidade(relatorio.getQuantidade() + compra.getQuantidade());
                        }
                        RelatorioDao.getInstance().salvar(relatorio);
                    }
                    produto.decrementarQuantidade(compra.getQuantidade());
                    ProdutoDao.getInstance().salvar(produto);
                }
                session.removeAttribute("listaProdutos");
                session.setAttribute("mensagem", "Seu pedido de compra foi gerado com sucesso");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        cih = request.getRequestDispatcher("index.jsp");
        cih.forward(request, response);
        return;
    }
}
